Quake 3 源码分析(二) | 您所在的位置:网站首页 › quake3 命令 › Quake 3 源码分析(二) |
Quake 3 源码分析(二) --命令与实现 1. void Cvar_Init (void) { Cvar_Get("sv_cheats", "1", CVAR_ROM | CVAR_SYSTEMINFO ); Cmd_AddCommand( const char *cmd_name, xcommand_t function )//将命令(命令名及对应的函数)增加到cmd_functions链上去,内存分配使用smallzone(内存池初始大小512 * 1024)或mainzone(1024 * 1024 * 24,在Com_InitZoneMemory()中初始化); }
2 .cvar_t *Cvar_Get( const char *var_name, const char *var_value, int flags ) { Cvar_FindVar (var_name)//在hash表中查找 If(找到) { //根据flags的值重设var_value值 } Eles //没有找到 { var = &cvar_indexes[cvar_numIndexes];//在全局数组中得到空间 var->next = cvar_vars; cvar_vars = var;//加入链表
hash = generateHashValue(var_name);//使用hash算法生成hash值 var->hashNext = hashTable[hash];(#define FILE_HASH_SIZE 1024 static shader_t* hashTable[FILE_HASH_SIZE];) hashTable[hash] = var;//加入hash表 } } / static long generateHashValue( const char *fname ) { int i; long hash; char letter;
hash = 0; i = 0; while (fname[i] != '/0') { letter = tolower(fname[i]); hash+=(long)(letter)*(i+119); i++; } hash &= (FILE_HASH_SIZE-1); return hash; } typedef struct cvar_s { char *name; char *string; char *resetString; // cvar_restart will reset to this value char *latchedString; // for CVAR_LATCH vars int flags; qboolean modified; // set each time the cvar is changed int modificationCount; // incremented each time the cvar is changed float value; // atof( string ) int integer; // atoi( string ) struct cvar_s *next; struct cvar_s *hashNext; } cvar_t;
3.void Cbuf_AddText( const char *text ) { //text如” exec default.cfg/n” int l; l = strlen (text); if (cmd_text.cursize + l >= cmd_text.maxsize) // cmd_t cmd_text; { Com_Printf ("Cbuf_AddText: overflow/n"); return; } Com_Memcpy(&cmd_text.data[cmd_text.cursize], text, l); cmd_text.cursize += l; } typedef struct { byte *data;// àbyte cmd_text_buf[16384] int maxsize; int cursize; } cmd_t;
4.void Cbuf_Execute (void) { While(cmd_text.cursize) { //以”/n”or”;”为分隔符,解析上一条命令 //把解析出的命令从cmd_text移出 // Cmd_ExecuteString (line) } } void Cmd_ExecuteString( const char *text ) { //所命令COPY到cmd_cmd[]中 //检查注册的命令函数(cmd_functions,在Cmd_AddCommand中加入了注册的命令) //根据命令名从cmd_functions链表中查找,找到后调用对应的命令函数(cmd->function ()) //把这个项加在cmd_functions的最前面,加速下次查找 //如果没找到(Cvar_FindVar),调用Cvar_Set2函数加入hashTable[]中 } void Cmd_Exec_f( void ) {//” exec default.cfg/n” àexec命令的执行函数 { len = FS_ReadFile( filename, (void **)&f);//读入文件(default.cfg)内容到缓冲
Cbuf_InsertText (f);//把内容加入到cmd_text中
FS_FreeFile (f);// 释放缓冲 } void Cbuf_InsertText( const char *text ) { // move the existing command text for ( i = cmd_text.cursize - 1 ; i >= 0 ; i-- ) { cmd_text.data[ i + len ] = cmd_text.data[ i ]; }
// copy the new text in Com_Memcpy( cmd_text.data, text, len - 1 );
// add a /n cmd_text.data[ len - 1 ] = '/n';
cmd_text.cursize += len; }
|
CopyRight 2018-2019 实验室设备网 版权所有 |